//package com.boot.crm.redis;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cache.annotation.CachingConfigurerSupport;
//import org.springframework.cache.annotation.EnableCaching;
//import org.springframework.cache.interceptor.KeyGenerator;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.PropertySource;
//import org.springframework.data.redis.cache.RedisCacheManager;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
//import org.springframework.data.redis.serializer.RedisSerializer;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//import redis.clients.jedis.JedisPoolConfig;
//
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * 本处为redis使用的第一个场景:数据缓存
// *
// * @Author: ys
// * @Date:Create in 2018/5/31 11:48
// * @Description:
// * springBoot环境下使用缓存技术:1.项目中导入相关缓存技术的依赖包
// *                           2.在配置类上使用@EnableCaching开启缓存支持
// */
//@Configuration
//@EnableCaching  //开启注解       extends CachingConfigurerSupport
//@PropertySource(value = {"file:/opt/crm_boot/redis.properties"})//配置外部文件路径(${user.dir}:项目的路径)
//public class RedisConfig extends CachingConfigurerSupport {
//
//    @Value("${spring.redis.host}")
//    private String host;
//
//    @Value("${spring.redis.port}")
//    private int port;
//
//    @Value("${spring.redis.timeout}")
//    private int timeout;
//
//    @Value("${spring.redis.password}")
//    private String password;
//
//    @Value("${spring.redis.database}")
//    private int database;
//
//    @Value("${spring.redis.pool.max-idle}")
//    private int maxIdle;
//
//    @Value("${spring.redis.pool.min-idle}")
//    private int minIdle;
//
//    @Autowired
//    private JedisConnectionFactory jedisConnectionFactory;
////
////    自定义缓存key生成策略
////    @Bean //缓存以key－value的形式保存在redis中,设定保存key的格式
////    public KeyGenerator keyGenerator(){
////        return new KeyGenerator() {
////            @Override
////            public Object generate(Object target, Method method, Object... params   ) {
////                StringBuilder sb = new StringBuilder();
////                sb.append(target.getClass().getName());
////                sb.append(method.getName());
////                for (Object param:params){
////                    sb.append(param.toString());
////                }
////                return sb.toString();
////            }
////        };
////    }
//
//    /**
//     * 注册cache 管理器，设置过期时间的单位是秒
//     */
//    @Bean
//    public RedisCacheManager cacheManager() {
//        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
////        默认超时时间，单位秒
//        redisCacheManager.setDefaultExpiration(1000);
//        Map<String,Long> expiresMap = new HashMap<>();
////        缓存用户信息的cacheName和超时时间
//        expiresMap.put("user",1800L);
////        缓存产品信息的cacheName和超时时间
//        expiresMap.put("product",6000L);
//        expiresMap.put("people",6000L);
//        redisCacheManager.setExpires(expiresMap);
//        return redisCacheManager;
//    }
////
////
//    @Bean
//    public RedisTemplate<Object, Object> redisTemplate() {
//        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(jedisConnectionFactory);
////         开启事务支持
//        redisTemplate.setEnableTransactionSupport(true);
////         使用String格式序列化缓存键
//        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//        redisTemplate.setKeySerializer(stringRedisSerializer);
//        redisTemplate.setHashKeySerializer(stringRedisSerializer);
//        return redisTemplate;
//    }
//    /**
//     * redis模板，存储关键字是字符串，值是Jdk序列化
//     * @param factory
//     */
//    @Bean
//    public RedisTemplate<?,?> redisTemplate(RedisConnectionFactory factory) {
//        RedisTemplate<?,?> redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(factory);
//        //key序列化方式;但是如果方法上有Long等非String类型的话，会报类型转换错误；
//        RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型不可以,会出现异常信息;
//
//        redisTemplate.setKeySerializer(redisSerializer);
//        redisTemplate.setHashKeySerializer(redisSerializer);
//
//        //JdkSerializationRedisSerializer序列化方式;
//        JdkSerializationRedisSerializer jdkRedisSerializer=new JdkSerializationRedisSerializer();
//        redisTemplate.setValueSerializer(jdkRedisSerializer);
//        redisTemplate.setHashValueSerializer(jdkRedisSerializer);
//        redisTemplate.afterPropertiesSet();
//        return redisTemplate;
//    }
//
//    /**
//     * redis 连接池的基本设置
//     * @return
//     */
//    @Bean
//    public JedisConnectionFactory redisConnectionFactory() {
//        JedisConnectionFactory factory = new JedisConnectionFactory();
//        factory.setHostName(host);
//        factory.setPort(port);
//        factory.setPassword(password);
//        //存储的库
//        factory.setDatabase(database);
//        //设置连接超时时间
//        factory.setTimeout(timeout);
//        factory.setUsePool(true);
//        factory.setPoolConfig(jedisPoolConfig());
//        return factory;
//    }
//
//    /**
//     * 连接池配置
//     * @return
//     */
//    @Bean
//    public JedisPoolConfig jedisPoolConfig() {
//        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//        jedisPoolConfig.setMaxIdle(maxIdle);
//        jedisPoolConfig.setMinIdle(minIdle);
////    jedisPoolConfig.set ...
//        return jedisPoolConfig;
//    }
//}
